# -*- coding: utf-8 -*-
import base64import gzipimport jsonimport osimport tracebackimport StringIOimport yamlfrom legendaryPowerScript._lpcommon.mod_platform.modConfig import ModConfigfrom legendaryPowerScript._lpcommon import apiUtilclass PluginManager:
    def __init__(self, platform):
        """
        插件管理类，请在插件的__init__中调用 apiUtil.getPluginManager().registerPlugin(self) 将插件注册

        此外，读取配置项也使用这里的 loadConfigFile， loadAllFilesByPath 加载。 前者可读取指定的单个文件， 后者会读取所有符合条件的文件
        由于配置文件的存储方式不一样，在网络服和单机环境下，底层也不一样。

        网络服： 配置文件存在Linux服务器的 /home/fuzhu/[游戏名] 内， 分为 common 和 [服务器类型] 两个目录， 分别由 getModFolder() 和 getGameFolder() 获取
        单机：
            PC测试环境： 配置文件存在 D:/mcpe/[游戏名]/common 内。
            玩家正式环境： 配置文件存在py文件内，在Mod启动时，由 modConfig.setConfig() 直接将字典传入。

        """
        pass

    def addModConfig(self, modConfig):
        # type: (ModConfig) -> None
        """
        添加组件配置到管理器。非网络服环境专用
        使用示例：

        modConfig = ModConfig(“palSys”, (1,0,0))  #两个参数分别为： 插件的ID 插件的加载优先级。在Mod环境中，优先级越大，在合并配置文件时就越靠后
        compressedConfig = {'config.yml': {'配置项': “配置值”}} #配置项，使用脚本生成，别手动改
        modConfig.setConfig(compressedConfig)
        apiUtil.getPluginManager().addModConfig(modConfig)

        Args:
            modConfig (ModConfig): 要添加的模块配置对象。
        """
        pass

    def getPlugin(self, sysName):
        # type: (str) -> ServerPlugin
        """
        根据系统名称获取插件。

        Args:
            sysName (str): 插件的系统名称。

        Returns:
            ServerPlugin: 如果找到插件则返回，否则返回None。
        """
        pass

    def getModFolder(self):
        # type: () -> str or None
        """
        获取common配置的文件夹路径。网络服环境专用

        Returns:
            str or None: 若为网络服：返回common路径。若为PC测试环境：返回D:/mcpe/base。其他情况：返回None
        """
        pass

    def getAllModFolders(self):
        """
        获取所有模组的配置文件夹路径列表。PC测试环境专用

        Returns:
            list[str]: 若为网络服：返回[getModFolder()]。若为PC测试环境：返回包含所有模块文件夹路径的列表。其他情况：返回None
        """
        pass

    def getGameFolder(self):
        # type: () -> str or None
        """
        获取本game服的配置文件夹路径。网络服环境专用

        Returns:
            str or None: 游戏根文件夹的路径，如果不是网络服则返回None。
        """
        pass

    def loadConfigFile(self, folder):
        # type: (str) -> dict or None
        """
        加载从根节点下出发的指定路径的配置文件。
        如：若要加载 D:/mcpe/游戏名/common/items/装备/尚方宝剑.yml。 则使用 loadConfigFile("items/装备/尚方宝剑.yml")
        若多个模组其中都有此文件，则它们的内容会被合并。同一个key的情况下，高版本的会将低版本的覆盖。

        Args:
            folder (str): 配置文件的相对路径。

        Returns:
            dict or None: 加载的配置文件内容，如果不存在则返回None。
        """
        pass

    def getGameName(self):
        # type: () -> str
        """
        获取当前网络服的名称。与配置文件（D:/mcpe下）的根目录名相同
        目前：
            无尽法则： game
            封神斗魂： douluo
            其他： 由模组包中使用了 res_xxx 中的xxx而定。如口袋钛晶觉醒因使用了 res_pokemon 所以名称为 pokemon

        若非网络服，则返回 base

        Returns:
            str: 当前网络服的名称。
        """
        pass

    def loadAllFilesByPath(self, path, cb, exclude=None):
        # type: (str, callable[str, str, dict], list[str]) -> None
        """
        加载指定路径下的所有配置文件，并执行回调函数。

        Args:
            path (str): 从common下出发的路径。
            cb (callable): 载入文件时的回调。接受三个参数，分别是文件的完整路径，文件名（包含扩展名），文件内容（dict）
            exclude (list, optional): 跳过的文件。需传入从common下出发的路径，如 item/config.yml
        """
        pass

    def registerPlugin(self, clazz):
        # type: () -> None
        """
        请在插件的__init__中时调用 apiUtil.getPluginManager().registerPlugin(self) 将插件注册
        """
        pass

    def getServerType(self):
        # type: () -> str
        """
        Returns:
            serverType (str): 当前服务器的类型
        """
        pass

    def getServerFolder(self):
        # type: () -> str
        """
        Returns:
            path (str): 当前服务器的根目录
        """
        pass

    def getServerId(self):
        # type: () -> str
        """
        Returns:
            serverId (str): 当前服务器的ID
        """
        pass

    def isFormalServer(self):
        # type: () -> bool
        """
        Returns:
            isFormalServer (bool): 当前是否在正式服环境
        """
        pass

    def registerCommand(self, command, commandExecuter):
        # type: (str, CommandExecuter) -> None
        """
        注册指令
        Args:
            command (str): 指令头。
            commandExecuter (CommandExecuter): 指令处理器。
        """
        pass

    class HealCommand(CommandExecuter):
        def help(self, sender):
            # type: () -> None
        def help(self, sender):
            sender.sendMessage(".heal self: 治疗自己")
            sender.sendMessage(".heal other 实体ID: 治疗其他实体")

    apiUtil.registerCommand("heal", HealCommand())

    # 玩家执行指令：
    # .heal self：调用healSelf，sender=发送者，args=[]
    # .heal other 123456：调用healOther，sender=发送者，args=["123456"]
    """
    pass

    def __init__(self):
        """
        初始化指令
        """
        pass

